#include<iostream>

void Xprintf()
{
    std::cout<<std::endl;
}
//函数模板可以自动推导数据类型
// ...表示传进来的类型要是一个参数包的类型
// ... agrs 表示参数包类型的对象（agrs）
//Args&& 用右值引用 配合引用折叠，不改变传进来的值的属性--左右值属性
template<class T,class ...Args>
void Xprintf(const T& v,Args&& ...args)
{
    //输出第一个参数
    std::cout<<v;
    //递归调用
    if((sizeof ...(args))>0)
    {
        //用完美转发解参数包，并且把参数包的第一个对象传递给函数的第一个形参
        //剩下的参数包传递给第二个参数包形参。
        Xprintf(std::forward<Args>(args)...);
    }else{
        //如果参数包对象没有参数了
        //调用重载的无参的函数
        Xprintf();
    }

}
int main()
{
    Xprintf(10,"hhhhhh","jjjj");
    return 0;

}